/* Jozef Tvarozek - Coloured leaves */
#include <stdio.h>
#include <stdlib.h>

#define MAXN 10005

typedef struct
{
  int f,t;
  int c[2],used;
} EDGE;

EDGE e[MAXN+MAXN];
int col[MAXN],ne,nv;
int pos[MAXN+1];

int min(int a,int b)
{
  if ( a < b ) return a;
  return b;
}
void visit(int vert,int from, int *c)
{
  int i;
  c[0] = c[1] = 0;
  for (i = pos[vert]; i < pos[vert+1]; i++)
  if ( e[i].t != from )
  {
    if ( e[i].used == 0 )
    {
      e[i].used = 1;
      if ( col[e[i].t] != -1 )
      {
        e[i].c[0] = 0; e[i].c[1] = 0;
        e[i].c[ !col[e[i].t] ] = 1;
      }
      else
        visit(e[i].t,vert,e[i].c);
    }
    c[0] += min(e[i].c[0],e[i].c[1]+1);
    c[1] += min(e[i].c[0]+1,e[i].c[1]);
  }
}
int edge_cmp(const void *va, const void *vb)
{
  EDGE *ea = (EDGE*)va, *eb = (EDGE*)vb;
  if ( ea->f > eb->f ) return 1;
  if ( ea->f < eb->f ) return -1;
  if ( ea->t > eb->t ) return 1;
  return -1;
}

int main(void)
{
  FILE *fin,*fout;
  int nleaf,i,j,best=99999999,res[2];

  fin = fopen("col.in","rt");
  fout = fopen("col.out","wt");

  fscanf(fin,"%d %d",&nv,&nleaf);
  ne = nv-1;
  for (i = 0; i < nleaf; i++)
  {
    fscanf(fin,"%d",&j);
    col[i] = j;
  }
  for (i = nleaf; i < nv; i++)
    col[i] = -1;
  for (i = 0; i < ne; i++)
  {
    fscanf(fin,"%d %d",&e[i].f,&e[i].t);
    e[i].f--; e[i].t--;
    e[ne+i].f = e[i].t;
    e[ne+i].t = e[i].f;
  }
  ne = 2*ne;
  qsort(&e,ne,sizeof(EDGE),edge_cmp);
  j = 0;
  for (i = 1; i < nv; i++)
  {
    while ( e[j].f == i-1 && j < ne ) j++;
    pos[i] = j;
  }
  pos[nv] = ne;
/*  for (i = 0; i < nv; i++)
  {
    printf("Vrchol #%d: ",i+1);
    for (j = pos[i]; j < pos[i+1]; j++)
      printf("%d, ",e[j].t+1);
    printf("\n");
  }
*/
//  getchar();

  for (i = nleaf; i < nv; i++)
  {
    visit(i,i,res);
    if ( best > res[0]+1 )
      best = res[0]+1;
    if ( best > res[1]+1 )
      best = res[1]+1;
  }
  fprintf(fout,"%d\n",best);
//  printf("%d\n",best);
  return 0;
}

